﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 角色管理类。
 * 
 * 最后修改：2011-10-30
 * ************************************************************/

namespace Mozlite.Common
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Mozlite.Common.Configuration;

    /// <summary>
    /// 用户角色管理类。
    /// </summary>
    public class Roles
    {
        private Roles() { }

        private static readonly string userRoleCacheKeyFormat = "SiteSettings.{0}::UserRoles.{1}";

        /// <summary>
        /// 获取用户角色列表。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户角色列表。</returns>
        public static List<Role> GetRoles(int userID)
        {
            return Caches.Get<List<Role>>(GetCacheKey(userID), Globals.MinuteSeconds * 3, Globals.MinuteSeconds * 3, () =>
            {
                return SecurityDataProvider.Current.GetRoles(SiteSettings.Current.SettingsID, userID);
            });
        }

        private static string GetCacheKey(int userID) {
            return string.Format(userRoleCacheKeyFormat, SiteSettings.Current.SettingsID, userID);
        }

        /// <summary>
        /// 将以','分割的角色ID的角色添加给当前用户。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="roleIDs">以','分割的角色ID。</param>
        public static void AddRoles(int userID, string roleIDs)
        {
            AddRoles(userID, roleIDs, DateTime.Now, DateTime.MaxValue);
        }
        /// <summary>
        /// 将以','分割的角色ID的角色添加给当前用户。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="roleIDs">以','分割的角色ID。</param>
        /// <param name="enabledDate">生效时间。</param>
        /// <param name="expiredDate">过期时间。</param>
        public static void AddRoles(int userID, string roleIDs, DateTime enabledDate, DateTime expiredDate)
        {
            if (string.IsNullOrEmpty(roleIDs))
                return;
            SecurityDataProvider.Current.AddRoles(SiteSettings.Current.SettingsID, userID, roleIDs, enabledDate, expiredDate);
            Caches.Remove(GetCacheKey(userID));
        }
        /// <summary>
        /// 角色添加给当前用户。
        /// </summary>
        /// <param name="roles">用户角色实例列表。</param>
        public static void AddRoles(List<UserRole> roles)
        {
            if (roles == null || roles.Count == 0)
                return;
            SecurityDataProvider.Current.AddRoles(roles);
            Caches.Remove(GetCacheKey(roles.First<UserRole>().UserID));
        }

        /// <summary>
        /// 获取用户角色列表。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户角色列表。</returns>
        public static Dictionary<int, UserRole> GetUserRoles(int userID)
        {
            return SecurityDataProvider.Current.GetUserRoles(SiteSettings.Current.SettingsID, userID);
        }
        /// <summary>
        /// 加载所有角色。
        /// </summary>
        /// <returns>返回所有用户组。</returns>
        public static Dictionary<int, Role> LoadRoles()
        {
            return Caches.Get<Dictionary<int, Role>>("AllRoles."+SiteSettings.Current.SettingsID,Globals.MinuteSeconds, Globals.MinuteSeconds*3, () =>
            {
                var roles = SecurityDataProvider.Current.LoadRoles(SiteSettings.Current.SettingsID);
                if (roles.Count == 0)
                {
                    Roles.SaveRole(Role.Register);
                    Roles.SaveRole(Role.Administrator);
                    roles = SecurityDataProvider.Current.LoadRoles(SiteSettings.Current.SettingsID);
                }
                return roles;
            });
        }
        /// <summary>
        /// 创建或更新角色信息。
        /// </summary>
        /// <param name="role">角色<see cref="T:Mozlite.Common.Role"/>实例对象。</param>
        /// <returns>如果创建或更新角色返回<c>true</c>，否则返回<c>false</c>。</returns>
        public static bool SaveRole(Role role)
        {
            if (SecurityDataProvider.Current.SaveRole(role))
            {
                RemoveAllCache();
                return true;
            }
            return false;
        }
        /// <summary>
        /// 获取角色实例。
        /// </summary>
        /// <param name="roleID">角色ID。</param>
        /// <param name="fromDB">是否从数据库中加载。</param>
        /// <returns>返回角色实例。</returns>
        public static Role GetRole(int roleID, bool fromDB = false)
        {
            if (fromDB)
                return SecurityDataProvider.Current.GetRole(SiteSettings.Current.SettingsID, roleID);
            return LoadRoles()[roleID];
        }
        /// <summary>
        /// 移除用户的角色信息。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="roleIDs">角色ID集合。</param>
        public static void RemoveRoles(int userID, string roleIDs)
        {
            if (string.IsNullOrEmpty(roleIDs))
                return;
            SecurityDataProvider.Current.RemoveRoles(SiteSettings.Current.SettingsID, userID, roleIDs);
        }
        /// <summary>
        /// 删除角色。
        /// </summary>
        /// <param name="roleIDs">删除角色的ID。</param>
        /// <returns>如果删除角色返回<c>true</c>，否则返回<c>false</c>。</returns>
        public static bool DeleteRoles(params int[] roleIDs)
        {
            if (roleIDs != null)
                return DeleteRoles(roleIDs.Join());
            return false;
        }
        /// <summary>
        /// 获取当前角色的用户。
        /// </summary>
        /// <param name="roleID">角色ID。</param>
        /// <returns>返回当前角色用户名称列表。</returns>
        public static List<string> GetUsers(int roleID)
        {
            return SecurityDataProvider.Current.GetUsers(SiteSettings.Current.SettingsID, roleID);
        }
        /// <summary>
        /// 删除角色。
        /// </summary>
        /// <param name="roleIDs">删除角色的ID。</param>
        /// <returns>如果删除角色返回<c>true</c>，否则返回<c>false</c>。</returns>
        public static bool DeleteRoles(string roleIDs)
        {
            if (SecurityDataProvider.Current.DeleteRoles(SiteSettings.Current.SettingsID, roleIDs))
            {
                RemoveAllCache();
                return true;
            }
            return false;
        }
        /// <summary>
        /// 获取角色ID。
        /// </summary>
        /// <param name="roleName">角色名称。</param>
        /// <returns>返回角色ID。</returns>
        public static int GetRoleID(string roleName)
        {
            return SecurityDataProvider.Current.GetRoleID(SiteSettings.Current.SettingsID, roleName);
        }
        /// <summary>
        /// 获取当前等级的角色列表。
        /// </summary>
        /// <param name="level">角色等级。</param>
        /// <returns>返回角色列表。</returns>
        public static List<Role> GetRoles(RoleLevel level)
        {
            List<Role> roles = new List<Role>();
            foreach (var role in LoadRoles().Values)
            {
                if (role.RoleLevel == level)
                    roles.Add(role);
            }
            return roles;
        }

        private static void RemoveAllCache()
        {
            Caches.RemoveByPattern(".*role.*");
        }
    }
}
